package br.com.gkarian.mydesk.services.financeiro;

import java.util.List;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.caelum.vraptor.ioc.Component;
import br.com.gkarian.mydesk.model.Usuario;
import br.com.gkarian.mydesk.model.financeiro.Banco;
import br.com.gkarian.mydesk.model.financeiro.ContaBancaria;
import br.com.gkarian.mydesk.model.financeiro.TipoTransacao;
import br.com.gkarian.mydesk.model.financeiro.Transacao;
import br.com.gkarian.mydesk.services.financeiro.interfaces.BancoService;
import br.com.gkarian.mydesk.services.financeiro.interfaces.ContaBancariaService;
import br.com.gkarian.mydesk.services.financeiro.interfaces.FinanceiroServiceProxy;
import br.com.gkarian.mydesk.services.financeiro.interfaces.TipoTransacaoService;
import br.com.gkarian.mydesk.services.financeiro.interfaces.TransacaoService;
import br.com.gkarian.mydesk.services.interfaces.UsuarioService;

@Component
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public class FinanceiroServiceProxyImpl implements FinanceiroServiceProxy {

	private TransacaoService transacaoService;
	private BancoService bancoService;
	private ContaBancariaService contaBancariaService;
	private TipoTransacaoService tipoTransacaoService;
	private UsuarioService usuarioService;

	public FinanceiroServiceProxyImpl(TransacaoService transacaoService, BancoService bancoService,
			TipoTransacaoService tipoTransacaoService, UsuarioService usuarioService,
			ContaBancariaService contaBancariaService) {
		this.transacaoService = transacaoService;
		this.bancoService = bancoService;
		this.contaBancariaService = contaBancariaService;
		this.tipoTransacaoService = tipoTransacaoService;
		this.usuarioService = usuarioService;
	}

	@Override
	public void cadastrarTransacao(Transacao transacao, Usuario usuario)
			throws Exception {
		transacaoService.cadastrarTransacao(transacao, usuario);
	}

	@Override
	public Transacao carregarTransacao(Integer id) throws Exception {
		return transacaoService.carregarTransacao(id);
	}

	@Override
	public void atualizarTransacao(Transacao transacao, Usuario usuario)
			throws Exception {
		transacaoService.atualizarTransacao(transacao, usuario);
	}

	@Override
	public List<Transacao> listarTransacoesPorUsuario(Usuario usuario)
			throws Exception {
		return transacaoService.listarTransacoesPorUsuario(usuario);
	}

	@Override
	public void removerTransacao(Transacao transacao, Usuario usuario)
			throws Exception {
		transacaoService.removerTransacao(transacao, usuario);
	}
	
	@Override
	public Usuario recuperarUsuarioParaCadastroTransacao(Usuario usuario)
			throws Exception {
		return usuarioService.carregarParaCadastroTransacao(usuario);
	}

	@Override
	public Banco cadastrarBanco(Banco banco) throws Exception {
		return bancoService.cadastrarBanco(banco);
	}

	@Override
	public Banco carregarBanco(Integer id) throws Exception {
		return bancoService.carregarBanco(id);
	}

	@Override
	public void removerBanco(Banco banco) throws Exception {
		bancoService.removerBanco(banco);
	}

	@Override
	public void atualizarBanco(Banco banco) throws Exception {
		bancoService.atualizarBanco(banco);
	}

	@Override
	public List<Banco> listarBancos() throws Exception {
		return bancoService.listarBancos();
	}

	@Override
	public void cadastrarTipoTransacao(TipoTransacao tipoTransacao,
			Usuario usuario) throws Exception {
		tipoTransacaoService.cadastrarTipoTransacao(tipoTransacao, usuario);
	}

	@Override
	public TipoTransacao carregarTipoTransacao(Integer id) throws Exception {
		return tipoTransacaoService.carregarTipoTransacao(id);
	}

	@Override
	public void atualizarTipoTransacao(TipoTransacao tipoTransacao)
			throws Exception {
		tipoTransacaoService.atualizarTipoTransacao(tipoTransacao);
	}

	@Override
	public List<TipoTransacao> listarTipoTransacaoPorUsuario(Usuario usuario)
			throws Exception {
		return tipoTransacaoService.listarTipoTransacaoPorUsuario(usuario);
	}

	@Override
	public void removerTipoTransacao(TipoTransacao tipoTransacao)
			throws Exception {
		tipoTransacaoService.removerTipoTransacao(tipoTransacao);
	}

	@Override
	public ContaBancaria cadastrarContaBancaria(ContaBancaria contaBancaria,
			Integer bancoId, Usuario usuario) throws Exception {
		return contaBancariaService.cadastrarContaBancaria(contaBancaria, bancoId, usuario);
	}

	@Override
	public List<ContaBancaria> listarContasBancarias(Usuario usuario)
			throws Exception {
		return contaBancariaService.listarContasBancarias(usuario);
	}

	@Override
	public ContaBancaria carregarContaBancaria(Integer contaBancariaId)
			throws Exception {
		return contaBancariaService.carregarContaBancaria(contaBancariaId);
	}

	@Override
	public void removerContaBancaria(ContaBancaria contaBancaria)
			throws Exception {
		contaBancariaService.removerContaBancaria(contaBancaria);
	}

	@Override
	public void removerContaBancaria(Integer id) throws Exception {
		contaBancariaService.removerContaBancaria(id);
	}

	@Override
	public void atualizarContaBancaria(ContaBancaria contaBancaria,
			Integer bancoId, Usuario usuario) throws Exception {
		contaBancariaService.atualizarContaBancaria(contaBancaria, bancoId, usuario);
	}

	@Override
	public void atualizarContaBancaria(ContaBancaria contaBancaria)
			throws Exception {
		contaBancariaService.atualizarContaBancaria(contaBancaria);
	}

	@Override
	public String atualizarSaldoContaBancaria(Integer idContaBancaria,
			Usuario usuario) throws Exception {
		return contaBancariaService.atualizarSaldoContaBancaria(idContaBancaria, usuario);
	}

}
